home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_07
/
1007040a
< prev
next >
Wrap
Text File
|
1992-03-31
|
10KB
|
291 lines
/* Listing 1 */
/*****************************************************
Name: SQL_PROC.C
Description: Library of functions to support
stored SQL procedures with
db_Vista and db_Query
Global Function List: sqlproc_del
sqlproc_exec
sqlproc_fetch_dev
sqlproc_fetch_str
sqlproc_find
sqlproc_mod
sqlproc_retrv
sqlproc_store
Portability: Standard C or MS Windows with
db_Vista and db_Query Librarys.
*****************************************************/
/* Standard C */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* MS Windows */
#if defined ( _WINDOWS )
#include <windows.h>
#endif
/* db_Vista and db_Query */
#define ANSI 1
#define LINT_ARGS 1
#include <vista.h>
#include <prto_fix.h>
#include <query.h>
/* Own */
#include <sql_proc.h>
#include <sqlpproc.h>
/*****************************************************
Name: sqlproc_fetch_dev
Parameters: Dev - pointer to output device
Return: Number of output lines
Description: After an sql statement is executed, this
function will fetch data to the device
specified.
*****************************************************/
int sqlproc_fetch_dev( FILE *Dev )
{
char *Str;
int NumLines = 0;
while (( Str = sqlproc_fetch_str()) != NULL )
{
fprintf( Dev, "%s\n", Str );
free( Str );
NumLines++;
}
return ( NumLines );
} /* function sqlproc_fetch_dev */
/*****************************************************
Name: sqlproc_fetch_str
Return: pointer to string on heap
Description: After an sql statement is executed, this
function will fetch data to a dynamically
allocated string on the heap. Columns
are comma and tab delimited.
*****************************************************/
char *sqlproc_fetch_str( void )
{
VALUE Vals[SQL_MAX_COLUMNS];
int Count, i;
size_t Size = 0;
char StrBuf[BUFSIZ];
char *StrPntr, *TmpPntr;
if ( q_nextval( &Count, Vals ) != Q_OKAY )
return ( NULL );
if (( StrPntr = malloc( 1 )) == NULL )
return ( NULL );
*StrPntr = '\0';
for ( i = 0; i < Count; i++ )
{
switch ( Vals[i].type )
{
default:
case '\0':
break;
case 'l':
sprintf( StrBuf, "%ld",
Vals[i].result.lv );
break;
case 'i':
sprintf( StrBuf, "%d",
Vals[i].result.iv );
break;
case 'F':
sprintf( StrBuf, "%g",
Vals[i].result.dv );
break;
case 'c':
#if defined( _WINDOWS )
sprintf( StrBuf, "%s",
Vals[i].result.cv.ptr );
#else
sprintf( StrBuf, "%s",
Vals[i].result.cv );
#endif
break;
} /* switch Vals */
Size += strlen( StrBuf ) + 1;
if ( i > 0 ) Size++;
TmpPntr = StrPntr;
if (( StrPntr = realloc( StrPntr, Size ))
== NULL )
{
free( TmpPntr );
return ( NULL );
}
if ( i > 0 ) strcat( StrPntr, ",\t" );
strcat( StrPntr, StrBuf );
} /* for i */
return ( StrPntr );
} /* function sqlproc_fetch_str */
/*****************************************************
Name: sqlproc_store
Parameters: Name - name of SQL stored procedure
Description - description of SQL command
Command - SQL command (text)
Return: result of d_fillnew()
Description: Stores the values passed as parameters in
a record of type SQL_PROC in the database
*****************************************************/
int sqlproc_store( char *Name, char *Description,
char *Command )
{
struct sql_proc SqlProc;
strcpy( SqlProc.sql_name, Name );
strcpy( SqlProc.sql_description, Description );
strcpy( SqlProc.sql_command, Command );
return ( d_fillnew( SQL_PROC, &SqlProc, CURR_DB ));
} /* function sqlproc_store */
/*****************************************************
Name: sqlproc_mod
Parameters: Name - name of SQL stored procedure
Description - description of SQL command
Command - SQL command (text)
Return: result of sqlproc_find() or d_crwrite()
Description: Modifies the current record or record
associated with the key Name with the
new values passed as parameters.
*****************************************************/
int sqlproc_mod( char *Name, char *Description,
char *Command )
{
int Status;
Status = sqlproc_find( Name );
if ( Status == TRUE || Status == S_OKAY )
{
if ( Description != NULL )
Status = d_crwrite( SQL_DESCRIPTION,
Description );
if ( Command != NULL )
Status = d_crwrite( SQL_COMMAND,
Command );
}
return ( Status );
} /* function sqlproc_mod */
/*****************************************************
Name: sqlproc_retrv
Parameters: Name - name of SQL stored procedure
SqlProc - pointer to sql_proc struct to
load with data
Return: result of sqlproc_find() or d_recread()
Description: Retrives the data in a record of type
SQL_PROC. Either the current record
(if Name == NULL ) or the record
associated with the key Name is retrived.
*****************************************************/
int sqlproc_retrv( char *Name,
struct sql_proc *SqlProc )
{
int Status;
Status = sqlproc_find( Name );
if ( Status == TRUE || Status == S_OKAY )
Status = d_recread( SqlProc, CURR_DB );
return ( Status );
} /* function sqlproc_retrv */
/*****************************************************
Name: sqlproc_exec
Parameters: Name - name of SQL stored procedure
Return: result of sqlproc_retrv() or q_sqlinit()
or S_NOMEMORY if out of heap space.
Description: A SQL stored procedure is retrived from
the database, parsed and executed.
*****************************************************/
int sqlproc_exec( char *Name, ... )
{
va_list VarArgList;
int ErrPos, Status;
struct sql_proc SqlProc;
#if defined( _WINDOWS )
char ErrMsg[MAXERRMSGTXT + 1];
#else
char *ErrMsg = NULL;
#endif
Status = sqlproc_retrv( Name, &SqlProc );
if ( Status != S_OKAY ) return ( Status );
SqlCommand = malloc( SQL_COMMAND_LEN + 1 );
if ( SqlCommand == NULL ) return ( S_NOMEMORY );
va_start( VarArgList, Name );
vsprintf( SqlCommand, SqlProc.sql_command,
VarArgList );
#if defined( _WINDOWS )
Status = q_sqlinit( SqlCommand, &ErrPos, ErrMsg );
#else
Status = q_sqlinit( SqlCommand, &ErrPos, &ErrMsg );
#endif
va_end( VarArgList );
#if defined( _DEBUG )
if ( Status > 0 )
{
/* Status != Q_OKAY, Q_END, Q_SET, Q_DEFINE,
** Q_FIELD, Q_VIEW, Q_BATCH, Q_HELP, Q_SHOW */
char *ErrMsgOut;
if (( ErrMsgOut = malloc( SQL_COMMAND_LEN +
MAXERMESTXT )) != NULL )
{
sprintf( ErrMsgOut,
"%s\n%s at position %d.",
SqlCommand, ErrMsg, ErrPos );
#if defined( _WINDOWS )
MessageBox( NULL, ErrMsgOut,
"SQL Parse Error", MB_OK );
#else
fprintf( stderr, "%s\n", ErrMsgOut );
#endif
free( ErrMsgOut );
}
}
#endif
free( SqlCommand );
return ( Status );
} /* function sqlproc_exec */
/*****************************************************
Name: sqlproc_del
Paramet